/**
 * 
 */
package czolgisci.display;

import java.awt.Component;
import java.awt.Image;
import java.util.Iterator;

import utils.time.IClockListener;

import czolgisci.events.TickEvent;

/**
 * Zarządza wyświetlaniem mapy gry. Zawiera iterator kontenera z obiektami do
 * wyświetlenia i pole do rysowania. Odbiera sygnały wysyłane przez zegar
 * (Clock). Gdy odbierze sygnał, wywoływana jest metoda render(), w której
 * poprzez użycie iteratora wyświetalne są wszystkie obiekty z kontenera.
 * 
 * @pattern Singleton
 * @author pillow
 */
public class DisplayManager implements IClockListener
{
	static private DisplayManager instance;

	private Component drawField;
	private Iterator<Image> imageIterator;

	private DisplayManager()
	{
	}

	/**
	 * @param imageIter
	 *            iterator kontenera, w ktorym trzymane sa obiekty do
	 *            wyświetlania
	 * @param drawField
	 *            pole, w ktorym wyswietlana jest gra
	 */
	public void init(Iterator<Image> imageIter, Component drawField)
	{
		this.drawField = drawField;
		this.imageIterator = imageIter;
	}

	/**
	 * Metoda wyświetlająca aktualny stan gry na ekranie
	 * 
	 * @throws Exception
	 */
	public void render() throws Exception
	{
		if (drawField == null)
		{
			throw new Exception("drawField not defined");
		}
		
		while (imageIterator.hasNext())
		{
			imageIterator.next();
		}
	}

	/**
	 * Metoda wzorca Singleton
	 * 
	 * @return jedyna instancja klasy
	 */
	static public DisplayManager getInstance()
	{
		if (instance == null)
		{
			instance = new DisplayManager();
		}
		return instance;
	}

	/**
	 * Ustawia nowe pole do rysowania
	 * 
	 * @param frame
	 *            nowe pole do rysowania
	 */
	public void setDrawField(Component frame)
	{
		drawField = frame;
	}

	/**
	 * @return pole do rysowania
	 */
	public Component getDrawField()
	{
		return drawField;
	}

	/**
	 * Metoda uruchamiana przez zegar
	 * 
	 * @see utils.time.IClockListener#onTick(czolgisci.events.TickEvent)
	 */
	public void onTick(TickEvent e)
	{
		//

	}

}
